数据类型:REFERENCE TO
重要
对于编译器版本 >= V3.3.0.0,引用被初始化(在 0 处)。
重要
如果引用是指设备输入,则该访问被应用为写访问。生成代码时,这会导致编译器警告:"...invalid assignment target”。
例子: rInput REF= Input;
如果您需要这种构造,则必须首先复制输入值(例如: rInput) 到具有写访问权限的变量。
与参考 REFERENCE 数据类型隐式引用另一个对象。作业是用 REF= 操作员.访问时,引用被隐式取消引用,因此不需要特殊的内容运算符 ^ 比如指针。
句法
<identifier> : REFERENCE TO <data type> ; <data type>: base type of the reference
PROGRAM PLC_PRG
VAR
rspeA : REFERENCE TO DUT_SPECIAL;
pspeA : POINTER TO DUT_SPECIAL;
speB : DUT_SPECIAL;
END_VAR
rspeA REF= speB; // Reference rspeA is alias for speB. The code corresponds to pspeA := ADR(speB);
rspeA := speD; // The code corresponds to pspeA^ := speD;ariTest : ARRAY[0..9] OF REFERENCE TO INT; priTest : POINTER TO REFERENCE TO INT; rriTest : REFERENCE TO REFERENCE TO INT; rbitTest : REFERENCE TO BIT;
引用类型不得用作数组、指针或引用的基类型。此外,引用不得引用位变量。这些类型的结构会产生编译器错误。
注意
当通过标识符及其别名同时访问同一存储单元时,程序的可读性会变得困难。
例子: speB 和 rspeA
提示
指向的引用和指针 BIT 变量是 无效 声明,以及具有基本类型的数组元素 BIT。
当引用被分配时 :=,无论引用是在左侧、右侧还是两侧,始终都会复制值:
Ref := value写入值value到参考点指向的位置。用指针表示法:Ref^ := valuevalue := Ref之后写入引用指向的值value。用指针表示法:value := Ref^Ref1 := Ref2写入的值Ref2指着。在那个位置Ref1指着。用指针表示法:Ref1^ := Ref2^
什么时候 REF= 使用时,始终应用地址,并且左侧必须有一个引用:
Ref REF= value: 参考点value。用指针表示法:Ref :=ADR(value)Ref1 REF= Ref2:Ref1指向相同的值Ref2。用指针表示法:Ref1 := Ref2Value REF = Ref导致编译错误
提示
在声明中, REFERENCE TO INT REF= value 表现得像 REFERENCE TO INT := value。
引用和指针的比较
更容易使用:
引用可以直接访问被引用对象的内容,而无需取消引用。
传递值时更精细和更简单的语法:
调用一个功能块,它传递一个没有地址运算符而不是指针的引用
例子:
fbDoIt(riInput:=iValue);代替:
fbDoIt_1(piInput:=ADR(iValue));类型安全:
分配两个引用时,编译器会检查它们的基类型是否匹配。这在指针的情况下不被检查。
测试参考的有效性
您可以使用运算符 __ISVALIDREF 检查引用是否指向有效值(即不等于 0 的值)。
句法
<boolean variable name> := __ISVALIDREF( <reference name> );
<reference name>: 声明的标识符 REFERENCE TO
布尔变量是 TRUE 当引用指向一个有效值时。否则就是 FALSE.
PROGRAM PLC_PRG
VAR
iAlfa : INT;
riBravo : REFERENCE TO INT;
riCharlie : REFERENCE TO INT;
bIsRef_Bravo : BOOL := FALSE;
bIsRef_Charlie : BOOL := FALSE;
END_VAR
iAlfa := iAlfa + 1;
riBravo REF= iAlfa;
riCharlie REF= 0;
bIsRef_Bravo := __ISVALIDREF(riBravo); (* becomes TRUE, because riBravo references to iAlfa, which is non-zero *)
bIsRef_Charlie := __ISVALIDREF(riCharlie); (* becomes FALSE, because riCharlie is set to 0 *)提示
在编译器版本 3.5.7.40 及更高版本中,隐式监控功能 检查指针 作用于类型变量 REFERENCE TO 与指针变量相同。